#include <Math/Operations.hpp>

// Non-template functions implementations:
namespace cvMath
{
	namespace priv
	{	// hided  function:
		float QqhToRGB(float q1, float q2, float hue)
		{
			hue = wrapDegree(hue);
			if(hue < 60.0f)
			{
				return q1 + (q2 - q1) * hue / 60.0f;
			}
			else if(hue < 180.0f)
			{
				return q2;
			}
			else if(hue < 240.0f)
			{
				return q1 + (q2 - q1) * (240.0f - hue) / 60.0f;
			}
			else
			{
				return q1;
			}
		}
	};

	RGBAf HLSAf(float hue, float light, float sat, float a)
	{
		float p1, p2;
		if(light <= 0.5f)	{ p2 = light * (1.0f + sat); } else { p2 = light + sat - light * sat; }
		p1 = 2.0f * light - p2;
		if(sat == 0.0f)
		{
			return RGBAf(light, light, light, a);
		}
		else
		{
			return RGBAf(priv::QqhToRGB(p1, p2, hue + 120.0f), priv::QqhToRGB(p1, p2, hue), priv::QqhToRGB(p1, p2, hue - 120.0f), a);
		}
	}

	RGBAi RGBAtoi(const RGBAf & c)
	{
		return RGBAi(c.r * 255.0f, c.g * 255.0f, c.b * 255.0f, c.a * 255.0f);
	}

	RGBAf RGBAtof(const RGBAi & c)
	{
		return RGBAf(c.r / 255.0f, c.g / 255.0f, c.b / 255.0f, c.a / 255.0f);
	}
}
